package com.liming.user.service;

import com.liming.common.pojo.dto.order.user.mini.MiniOrderEvaluateDTO;
import com.liming.common.pojo.dto.order.user.mini.MiniOrderQueryPage;
import com.liming.common.pojo.dto.order.user.mini.MiniOrderSelectCouponDTO;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.coupon.mini.MiniOrderCouponVO;
import com.liming.common.pojo.vo.order.mini.MiniOrderDetailVO;
import com.liming.common.pojo.vo.order.mini.MiniOrderSelectCouponVO;
import com.liming.common.pojo.vo.order.mini.MiniOrderVO;
import com.liming.common.pojo.vo.order.web.RefundOrderVO;

/**
 * @author liming
 * @date 2025/4/1
 */
public interface OrderService {

    /**
     * 用户结算时，选择可以选择的优惠券
     *
     * @return 优惠券信息
     */
    MiniOrderCouponVO orderCoupon(Integer amount);

    /**
     * 用户在订单中选择优惠券后， 返回商品信息（到手价）， 返回优惠后价格
     *
     * @param dto 选择优惠券信息
     * @return MiniOrderSelectCouponVO
     */
    MiniOrderSelectCouponVO selectCoupon(MiniOrderSelectCouponDTO dto);

    /**
     * 分页查询用户订单
     *
     * @param queryPage 分页查询参数
     * @return PageVO<MiniOrderVO>
     */
    PageVO<MiniOrderVO> page(MiniOrderQueryPage queryPage);

    /**
     * 订单详情
     *
     * @param id 订单ID
     * @return MiniOrderDetailVO
     */
    MiniOrderDetailVO detail(Long id);

    /**
     * 取消订单
     *
     * @param id 订单ID
     * @return 取消订单结果
     */
    Boolean cancel(Long id);

    /**
     * 完成订单
     *
     * @param id 订单ID
     * @return 完成订单结果
     */
    Boolean complete(Long id);

    /**
     * 支付成功回调
     *
     * @param id 订单ID
     * @return 支付成功回调结果
     */
    Boolean createOrderPaySuccess(Long id);

    /**
     * 订单评价
     *
     * @param miniOrderEvaluateDTO 评价参数
     * @return 评价结果
     */
    Boolean evaluate(MiniOrderEvaluateDTO miniOrderEvaluateDTO);

    /**
     * 订单退款
     *
     * @param id     订单ID
     * @param reason 退款原因
     * @return 退款结果
     */
    Boolean refund(Long id, String reason);

    /**
     * 退款详情
     *
     * @param id 订单ID
     * @return RefundOrderVO
     */
    RefundOrderVO refundDetail(Long id);
}
